# Pour l'adaptateur a la base sqlite
import sqlite3 

class adSqlite :
    def __init__(self) :
        self.__pathBD = "../Base.db3" # string
        self.__cursorBD = None # sqlite3.cursor
        self.__objSqlite = None # sqlite3
        self.__nomTB = "LIVRE"
        #-------les constantes de la classe....----#
        self.__encodage = 'latin-1'
        self.__indexKeyDB = 0
        self.__indexTitreDB = 1
        self.__indexAuteursDB = 2
        self.__indexCollectionDB = 3
        self.__indexISBNDB = 4
        pass
    
    def __structureLivre(self,livre):
        "Pour resoudre le probleme d'encodage dans la base de donnee"
        return (self.__encodeCaractere(livre.getTitre()), self.__encodeCaractere(str(livre.getAuteurs())), self.__encodeCaractere(livre.getCollection()), livre.getISBN())
    
    def __encodeCaractere(self,string):
        return unicode(string,self.__encodage)
            
    def connection (self) :
        """ Pour ce connecter a la base de donnee """
        try:
            self.__objSqlite = sqlite3.connect(self.__pathBD)
            self.__cursorBD = self.__objSqlite.cursor()
        except: # Python < 2.5
            #from pysqlite2 import dbapi2 as sqlite3
            print "Pas de lib suffisantes"
        
    def initialisationBD(self):
        try:
            self.__cursorBD.execute("create table %s (rowid integer primary key, titre char(30), auteurs char(90), collection char(20), isbn int)" % (self.__nomTB))
        except sqlite3.OperationalError:
            print "BD deja initialisee"
        
    def ajouterLivreBD (self, livre) :
        # returns void
        try:
            self.__cursorBD.execute("insert into %s (titre, auteurs, collection, isbn) values (?, ?, ?, ?)"%(self.__nomTB) ,self.__structureLivre(livre))
        except:    
            print "Erreur livre non ajoutee : %s" % (livre.getTitre())
        
    def rechercheLivreBD(self,livre):
        "On recheche le livre dans la base de donnee"
        self.__cursorBD.execute("select * from %s" % (self.__nomTB))
        result = self.__cursorBD.fetchall()
        for el in result:
            if el[1:]==self.__structureLivre(livre): #TODO:Astuce car sinon on a la cle devant...
                return True #TODO: pas de return dans les for
            #else:
            #    print "%s -- %s" % (el[1:],self.__structureLivre(livre))
        return False
    
    def rechercheLivreParTitreBD(self,titre):
        """On cherche un livre contenant cette chaine de caractere dans le titre
        Elle rend un livre de facon normal (sans la cle)
        Renvoie en forme de tableau de livre"""
        self.__cursorBD.execute("select * from %s" % (self.__nomTB))
        result = self.__cursorBD.fetchall()
        aRendre = []
        for el in result:
            if el[self.__indexTitreDB].find(self.__encodeCaractere(titre))!=-1:
                aRendre.append(el[1:])
        return aRendre
    
    def rechercheLivreParCollectionBD(self,collection):
        """On cherche un livre contenant cette chaine de caractere dans la collection
        Elle rend un livre de facon normal (sans la cle)
        Renvoie en forme de tableau de livre"""
        self.__cursorBD.execute("select * from %s" % (self.__nomTB))
        result = self.__cursorBD.fetchall()
        aRendre = []
        for el in result:
            if el[self.__indexCollectionDB].find(self.__encodeCaractere(collection))!=-1:
                aRendre.append(el[1:])
        return aRendre
    
    def rechercheLivreParISBNBD(self,isbn): #TODO:Ameliorer les performance et controle des donnees
        """On cherche un livre contenant cette chaine de caractere dans l'ISBN
        Elle rend un livre de facon normal (sans la cle)
        Renvoie en forme de tableau de livre"""
        self.__cursorBD.execute("select * from %s order by isbn" % (self.__nomTB))
        result = self.__cursorBD.fetchall()
        aRendre = []
        for el in result:
            if el[self.__indexISBNDB]==isbn: #REND unique...
                aRendre.append(el[1:])
                return aRendre #On l'a trouver ...
        return aRendre
    
    def rechercheLivreParAuteur(self,auteur):
        """On cherche un livre etant de cet auteur
        Elle rend un livre de facon normal (sans la cle)
        Renvoie en forme de tableau de livre"""
        pass
    
    def rechercheLivreParAuteurs(self,auteurs):
        """On cherche un livre etant de ces auteurs (il peut en avoir d'autre
        Elle rend un livre de facon normal (sans la cle)
        Renvoie en forme de tableau de livre"""
        pass
    
    def fermetureBD(self):
        """pour quitter la base de donnee proporement...."""
        self.__cursorBD.close()
        self.__objSqlite.close()
    
    def debugBD(self,order):
        self.__cursorBD.execute(order)
        return self.__cursorBD.fetchall()
    
    def debugSuivantBD(self):
        try:
            self.__cursorBD.next()
        except StopIteration:
            print "cursor vide ..."
        
    def debugFecthallBD(self):
        return self.__cursorBD.fetchall()